From 5999b1c73a6cf69bd552ee026bc0d74aced88acf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 13 Nov 2017 16:32:34 -0500 Subject: [PATCH] x11: Store toplevel list in GdkDisplay This will let us get rid of the root window. --- gdk/x11/gdkdevice-core-x11.c | 2 -- gdk/x11/gdkdevice-xi2.c | 1 - gdk/x11/gdkdisplay-x11.c | 18 +----------------- gdk/x11/gdkdisplay-x11.h | 1 + gdk/x11/gdkdnd-x11.c | 1 - gdk/x11/gdkmonitor-x11.c | 2 -- gdk/x11/gdkscreen-x11.c | 2 -- gdk/x11/gdkxid.c | 14 ++++++++++++-- 8 files changed, 14 insertions(+), 27 deletions(-) diff --git a/gdk/x11/gdkdevice-core-x11.c b/gdk/x11/gdkdevice-core-x11.c index 6176f6ca05..b166ba83f0 100644 --- a/gdk/x11/gdkdevice-core-x11.c +++ b/gdk/x11/gdkdevice-core-x11.c @@ -523,8 +523,6 @@ gdk_x11_device_core_window_at_position (GdkDevice *device, } } - g_list_free (toplevels); - xwindow = pointer_window; } diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c index 210c72bb10..733b652bb2 100644 --- a/gdk/x11/gdkdevice-xi2.c +++ b/gdk/x11/gdkdevice-xi2.c @@ -606,7 +606,6 @@ gdk_x11_device_xi2_window_at_position (GdkDevice *device, } } - g_list_free (toplevels); if (pointer_window != None) break; } diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index a9f4e2eb93..a165917940 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -3160,23 +3160,7 @@ gdk_x11_display_get_root_window (GdkDisplay *display) GList * gdk_x11_display_get_toplevel_windows (GdkDisplay *display) { - GdkWindow * root_window; - GList *new_list = NULL; - GList *tmp_list; - - root_window = gdk_x11_display_get_root_window (display); - - tmp_list = root_window->children; - while (tmp_list) - { - GdkWindow *w = tmp_list->data; - - if (w->window_type != GDK_WINDOW_FOREIGN) - new_list = g_list_prepend (new_list, w); - tmp_list = tmp_list->next; - } - - return new_list; + return GDK_X11_DISPLAY (display)->toplevels; } static void diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h index 87b5f7f5ed..3ddc7773b7 100644 --- a/gdk/x11/gdkdisplay-x11.h +++ b/gdk/x11/gdkdisplay-x11.h @@ -40,6 +40,7 @@ struct _GdkX11Display Display *xdisplay; GdkScreen *screen; GList *screens; + GList *toplevels; GSource *event_source; diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 71e8c29574..fc6ea6964c 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -600,7 +600,6 @@ gdk_window_cache_new (GdkDisplay *display) height * impl->window_scale, gdk_window_is_visible (window)); } - g_list_free (toplevel_windows); return result; } diff --git a/gdk/x11/gdkmonitor-x11.c b/gdk/x11/gdkmonitor-x11.c index 8cfddfe170..9de9060198 100644 --- a/gdk/x11/gdkmonitor-x11.c +++ b/gdk/x11/gdkmonitor-x11.c @@ -55,8 +55,6 @@ gdk_monitor_has_fullscreen_window (GdkMonitor *monitor) } } - g_list_free (toplevels); - return has_fullscreen; } diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index e5c0f2c2ed..c16107e178 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -840,8 +840,6 @@ _gdk_x11_screen_set_window_scale (GdkX11Screen *x11_screen, _gdk_x11_window_set_window_scale (window, scale); } - g_list_free (toplevels); - for (i = 0; i < x11_display->monitors->len; i++) { GdkMonitor *monitor = GDK_MONITOR (x11_display->monitors->pdata[i]); diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c index 8302e74b4e..1a8171ed45 100644 --- a/gdk/x11/gdkxid.c +++ b/gdk/x11/gdkxid.c @@ -61,6 +61,9 @@ _gdk_x11_display_add_window (GdkDisplay *display, g_warning ("XID collision, trouble ahead"); g_hash_table_insert (display_x11->xid_ht, xid, data); + + if (gdk_window_get_parent (GDK_WINDOW (data)) == NULL) + display_x11->toplevels = g_list_prepend (display_x11->toplevels, data); } void @@ -68,13 +71,20 @@ _gdk_x11_display_remove_window (GdkDisplay *display, XID xid) { GdkX11Display *display_x11; + GdkWindow *window; g_return_if_fail (GDK_IS_DISPLAY (display)); display_x11 = GDK_X11_DISPLAY (display); - if (display_x11->xid_ht) - g_hash_table_remove (display_x11->xid_ht, &xid); + if (!display_x11->xid_ht) + return; + + window = g_hash_table_lookup (display_x11->xid_ht, &xid); + if (window && gdk_window_get_parent (window) == NULL) + display_x11->toplevels = g_list_remove (display_x11->toplevels, window); + + g_hash_table_remove (display_x11->xid_ht, &xid); } /** -- 2.30.2